<?php
/**
 *
 * @author     richen
 * @copyright  Copyright (c) 2014 - <ric3000(at)163.com>
 * @license    CC BY-NC-ND
 * @version    14-9-27
 */


/**
 * 向第三方中转提交数据,需要加密的数据才使用
 * 返回代码: 成功返回数据  失败返回 ''
 */

//开发调试模式：显示错误报告，但不显示通知
//error_reporting(E_ERROR | E_WARNING | E_PARSE);
//上线模式：不显示任何错误报告
error_reporting(0);


if(checkReferer()){
    //支付中心publickey
    define("PAY_PUB_KEY",@file_get_contents("/www/key/rsa_pay_public_key.pem"));
    //用户中心publickey
    define("USER_PUB_KEY",@file_get_contents("/www/key/rsa_user_public_key.pem"));
    //微信appid
    define("APP_ID","wxa2f19e3431bf13b1");
    //微信appsecret
    define("APP_SECRET","187849ad5545b627bc3fed9cfeb41773");


    //第三方接口地址
    $urls = I("urls");
    //請求第三方接口方式 post get
    $method = I("method", "get");
    //code参数为json串,串内参数都需要加密
    $code = I("code");
    //其他无需加密参数,参数为json串,串内参数不加密
    $other = I("other");
    //加密KE类别: 1 用户中心  2 支付中心 3微信
    $keytype = I("keytype", 1);

    $postdata = $codearr = $otherarr = array();


    //Post請求第三方接口,code参数为json串
    if ($code) {
        $postdata = publickey_encodeing($code, $keytype);
    }

    if ($other) {
        $otherarr = json_decode($other, true);
        if (is_array($otherarr) && !empty($otherarr)) {
            $postdata = array_merge($otherarr, $postdata);
        }
    }

    //如果是请求微信OPENID
    if($keytype == 3){
        $urls = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.APP_ID.'&secret='.APP_SECRET.'&code='.$postdata['code'].'&grant_type=authorization_code';
    }

//    echo(var_dump($postdata));
//    exit;

    //CURL请求
    if ($result = curlRequest($method, $urls,$postdata)) {
        echo $result;
        exit;
    }
}

echo '';




################################以下為功能函數##############################################

function checkReferer(){
    //要进行判断的网站域名列表
    //仅域名，全小写，注意前面不要加http://
    //完全匹配，不支持通配符，需要通配符的可自行去写正则支持
    $domain_list = array("10.10.10.10","tech.enlink-mob.com", "alpha.enlink-mob.com", "beta.enlink-mob.com","fronthtml.cnautoshows.com");
    //以上列表中的域名是否为黑名单，否则为白名单(默认)
    $is_black_list = FALSE;

    //是否允许空来源(默认允许)，就是如果来源页为空时，允许通过，否则必须要有正确的来源地址
    //比如直接打开没有referer，还有Firefox中，wmp中，可能不一定每次都有referer来源地址
    $allow_empty_referer = FALSE;

    //取得访问来源的地址
    $referer = $_SERVER["HTTP_REFERER"];

    if($referer) {
        //解析来源地址
        $refererhost = parse_url($referer);
        //来源地址的主域名
        $host = strtolower($refererhost['host']);
        if($is_black_list) {
            //如果是黑名单
            if (in_array($host, $domain_list)) {
                return false;
            } else {
                return true;
            }
        } else {
            //如果是白名单
            if($host == $_SERVER['HTTP_HOST'] || in_array($host, $domain_list)) {
                return true;
            } else {
                return false;
            }
        }
    } else {
        if ($allow_empty_referer) {
            return true;
        } else {
            return false;
        }
    }
}

/**
 * 公钥加密函数
 * @param $crypttext 需加密的字符串
 * @param $publickey 公钥（使用物理地址）
 * @return bool
 */
function publickey_encodeing($jsontxt = '', $keytype) {
    if ($jsontxt && $keytype) {
        if ($keytype == 1) {
            //用户
            $publickey = USER_PUB_KEY;
        } elseif ($keytype == 2) {
            //支付
            $publickey = PAY_PUB_KEY;
        }

        $arraytxt = json_decode($jsontxt, true);
        if ($arraytxt && is_array($arraytxt)) {
            foreach ($arraytxt as $key => $value) {
                if (openssl_public_encrypt($value, $outstr, $publickey, OPENSSL_PKCS1_PADDING)) {
                    $arraytxt[$key] = base64_encode($outstr);
                }
            }

            return $arraytxt;
        }
    }
    return false;
}

/**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I('id',0); 获取id参数 自动判断get或者post
 * I('post.name','','htmlspecialchars'); 获取$_POST['name']
 * I('get.'); 获取$_GET
 * </code>
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @param mixed $filter 参数过滤方法
 * @return mixed
 */
function I($name, $default = '', $filter = null) {
    if (strpos($name, '.')) { // 指定参数来源
        list($method, $name) = explode('.', $name, 2);
    } else { // 默认为自动判断
        $method = 'param';
    }
    switch (strtolower($method)) {
        case 'get'     :
            $input =& $_GET;
            break;
        case 'post'    :
            $input =& $_POST;
            break;
        case 'put'     :
            parse_str(file_get_contents('php://input'), $input);
            break;
        case 'param'   :
            switch ($_SERVER['REQUEST_METHOD']) {
                case 'POST':
                    $input = $_POST;
                    break;
                case 'PUT':
                    parse_str(file_get_contents('php://input'), $input);
                    break;
                default:
                    $input = $_GET;
            }
            break;
        case 'request' :
            $input =& $_REQUEST;
            break;
        case 'session' :
            $input =& $_SESSION;
            break;
        case 'cookie'  :
            $input =& $_COOKIE;
            break;
        case 'server'  :
            $input =& $_SERVER;
            break;
        case 'globals' :
            $input =& $GLOBALS;
            break;
        default:
            return NULL;
    }
    if (empty($name)) { // 获取全部变量
        $data = $input;
        array_walk_recursive($data, 'filter_exp');
        $filters = isset($filter) ? $filter : '';
        if ($filters) {
            $filters = explode(',', $filters);
            foreach ($filters as $filter) {
                $data = array_map_recursive($filter, $data); // 参数过滤
            }
        }
    } elseif (isset($input[$name])) { // 取值操作
        $data = $input[$name];
        is_array($data) && array_walk_recursive($data, 'filter_exp');
        $filters = isset($filter) ? $filter : '';
        if ($filters) {
            $filters = explode(',', $filters);
            foreach ($filters as $filter) {
                if (function_exists($filter)) {
                    $data = is_array($data) ? array_map_recursive($filter, $data) : $filter($data); // 参数过滤
                } else {
                    $data = filter_var($data, is_int($filter) ? $filter : filter_id($filter));
                    if (false === $data) {
                        return isset($default) ? $default : NULL;
                    }
                }
            }
        }
    } else { // 变量默认值
        $data = isset($default) ? $default : NULL;
    }
    return $data;
}

/**
 * @param $method
 * @param $url
 * @param string $fields
 * @param string $userAgent
 * @param string $httpHeaders
 * @param string $username
 * @param string $password
 * @return array|bool|mixed
 */
function curlRequest($method, $url, $fields = '', $userAgent = '', $httpHeaders = '', $username = '', $password = '') {
    $ch = curl_init();
    if (false === $ch) {
        return false;
    }
    if (is_string($url) && strlen($url)) {
        $ret = curl_setopt($ch, CURLOPT_URL, $url);
    } else {
        return false;
    }
    //是否显示头部信息
    curl_setopt($ch, CURLOPT_HEADER, false);
    //
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    if ($username != '') {
        curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
    }

    if (stripos($url, "https://") !== FALSE) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    }

    $method = strtolower($method);
    if ('post' == $method) {
        curl_setopt($ch, CURLOPT_POST, true);
        if (is_array($fields)) {
            $fields = http_build_query($fields);
        }
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    } else if ('put' == $method) {
        curl_setopt($ch, CURLOPT_PUT, true);
    }
    //curl_setopt($ch, CURLOPT_PROGRESS, true);
    //curl_setopt($ch, CURLOPT_VERBOSE, true);
    //curl_setopt($ch, CURLOPT_MUTE, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); //设置curl超时秒数
    if (strlen($userAgent)) {
        curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    }
    $httpHeaders = $httpHeaders ? $httpHeaders : array('Expect:');
    if (is_array($httpHeaders)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);
    }
    $ret = curl_exec($ch);
    if (curl_errno($ch)) {
        curl_close($ch);
        return array(curl_error($ch), curl_errno($ch));
    } else {
        curl_close($ch);
        if (!is_string($ret) || !strlen($ret)) {
            return false;
        }
        return $ret;
    }

}


function array_map_recursive($filter, $data) {
    $result = array();
    foreach ($data as $key => $val) {
        $result[$key] = is_array($val) ? array_map_recursive($filter, $val) : call_user_func($filter, $val);
    }
    return $result;
}